﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;
using System.Data;

namespace TicketsPhone.Domain.Access
{
    public class PerfilRepositorio : ConexionSql<Perfil> ,  ICrud<Perfil>
    {
        public void GuardarTransaccion(TipoTransaccion tipoTransaccion)
        {
            throw new NotImplementedException();
        }

        public int Crear()
        {
            CrearComando("spPerfil_Crear");
            AgregarParametros();
            return Convert.ToInt32(ExecuteScalar());
        }

        /// <summary>
        /// Actualiza los datos del perfil, dependiedo de los datos que tiene seteados en el objeto
        /// </summary>
        /// <returns>true si la acutalización fué correcta</returns>
        public bool Editar()
        {
            CrearComando("spPerfil_Editar");
            AgregarParametros();
            return ExecuteNonQuery() > 0;
        }

        public bool Eliminar(int id)
        {
            CrearComando("spPerfil_Eliminar");
            AgregarParametro("@IdPerfil", id, ParameterDirection.Input, DbType.Int32);

            try 
	        {	        
		        return ExecuteNonQuery()>0;
	        }
	        catch (Exception e)
	        {
                LogErroresRepositorio.GuardarLog(e);
                return false;
	        }
        }

        /// <summary>
        /// Retorna los datos basicos de un perfil
        /// </summary>
        /// <param name="id">id del perfil a buscar</param>
        /// <returns></returns>
        public Perfil Cargar(int id)
        {
            Perfil objeto = new Perfil();
            CrearComando("spPerfil_Cargar");
            AgregarParametro("@IdPerfil", id, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            ExecuteReader();

            while (Read())
            {
                objeto = new Perfil(GetDataReader());
            }

            return objeto;
        }


        /// <summary>
        /// Retorna todos los perfiles dependiendo del filtro enviado
        /// </summary>
        /// <returns></returns>
        public List<Perfil> ObtenerTodos()
        {
            List<Perfil> lista = new List<Perfil>();
            CrearComando("spPerfil_Obtener");
            ExecuteReader();

            while (Read())
            {
                lista.Add(new Perfil(GetDataReader()));
            }

            return lista;
        }

        /// <summary>
        /// Filtra los perfiles dependiendo de los datos enviados
        /// </summary>
        /// <returns></returns>
        public List<Perfil> Filtrar()
        {
            List<Perfil> lista = new List<Perfil>();
            CrearComando("spPerfil_Filtrar");
            AgregarParametro("@Nombre", Objeto.Nombre, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            ExecuteReader();

            while (Read())
            {
                lista.Add(new Perfil(GetDataReader()));
            }

            return lista;
        }

        /// <summary>
        /// Retorna el listado de modulos y los permisos existentes en cada uno de estos dependiendo el perfil solicitado
        /// </summary>
        /// <param name="idPerfil">Id del perfil que se desea filtrar</param>
        /// <returns>Listado de modulos con los permisos del usuario</returns>
        public List<PermisosModulo> ObtenerTodosLosPermisos(int idPerfil)
        {
            List<PermisosModulo> lista = new List<PermisosModulo>();
            CrearComando("spPerfil_ObtenerPermisos");
            AgregarParametro("@IdPerfil", idPerfil, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            ExecuteReader();

            while (Read())
            {
                PermisosModulo permisos = new PermisosModulo();
                permisos.Modulo.IdModulo = GetIntValue("IdModulo");
                permisos.Modulo.Nombre = GetStringValue("Nombre");
                permisos.Listar = GetBooleanValue("Listar");
                permisos.Crear = GetBooleanValue("Crear");
                permisos.Editar = GetBooleanValue("Editar");
                permisos.Eliminar = GetBooleanValue("Eliminar");
                lista.Add(permisos);
            }

            return lista;
        }

        public void AgregarParametros()
        {
            AgregarParametro("@IdPerfil", Objeto.IdPerfil, ParameterDirection.InputOutput, DbType.Int32);
            AgregarParametro("@Nombre", Objeto.Nombre, ParameterDirection.Input, DbType.String);
            AgregarParametro("@Activo", Objeto.Activo, ParameterDirection.Input, DbType.Boolean);
            AgregarParametro("@Descripcion", Objeto.Descripcion, ParameterDirection.Input, DbType.String);
            AgregarParametro("@FechaModificacion", Objeto.FechaModificacion, ParameterDirection.Input, DbType.Date);
        }
    }
}
